#ifndef __ALGUTILS_H_
#define __ALGUTILS_H_

#include <string>
#include <vector>
#include <opencv2/opencv.hpp>

namespace AVSAnalyzer {

// 定义填充矩形结构
struct BOX_RECT {
    int left;
    int top;
    int right;
    int bottom;
};

/**
 * 预定义的颜色数组，用于可视化
 */
extern std::vector<cv::Scalar> COLORS;

class AlgUtils {
public:
    /**
     * 检查字符串是否为有效的UTF-8编码
     * @param str 要检查的字符串
     * @return 如果字符串是有效的UTF-8编码则返回true，否则返回false
     */
    static bool isValidUtf8(const std::string& str) {
        const auto* bytes = reinterpret_cast<const uint8_t*>(str.c_str());
        int length = static_cast<int>(str.size());
        
        for (int i = 0; i < length; ) {
            uint8_t lead = bytes[i++];
            
            if (lead <= 0x7F) continue; // ASCII
            
            if (lead < 0xC2 || lead > 0xF4) return false; // 非法起始字节
            
            int follow = (lead >= 0xE0) + (lead >= 0xF0) + 1;
            if (i + follow > length) return false;
            
            for (int j = 0; j < follow; ++j) {
                if ((bytes[i + j] & 0xC0) != 0x80) return false;
            }
            
            // 检查过编码范围
            if (lead == 0xE0 && bytes[i] < 0xA0) return false;
            if (lead == 0xED && bytes[i] > 0x9F) return false;
            if (lead == 0xF0 && bytes[i] < 0x90) return false;
            if (lead == 0xF4 && bytes[i] > 0x8F) return false;
            
            i += follow;
        }
        return true;
    }

    /**
     * 完整版letterbox函数 - 保持宽高比的同时缩放到目标尺寸
     * @param image 输入图像
     * @param padded_image 输出填充后的图像
     * @param pads 填充信息
     * @param scale 缩放比例
     * @param target_size 目标尺寸
     * @param pad_color 填充颜色
     */
    static void letterbox(const cv::Mat &image, cv::Mat &padded_image, BOX_RECT &pads, 
                   const float scale, const cv::Size &target_size, 
                   const cv::Scalar &pad_color) {
        // 1. 先按比例缩放
        cv::Mat resized_image;
        cv::resize(image, resized_image, cv::Size(), scale, scale);

        // 2. 计算四周填充量
        int pad_width = target_size.width - resized_image.cols;
        int pad_height = target_size.height - resized_image.rows;
        pads.left = pad_width / 2;    // 左右均匀填充
        pads.right = pad_width - pads.left;
        pads.top = pad_height / 2;    // 上下均匀填充
        pads.bottom = pad_height - pads.top;

        // 3. 四周添加填充
        cv::copyMakeBorder(resized_image, padded_image, 
                           pads.top, pads.bottom, pads.left, pads.right,
                           cv::BORDER_CONSTANT, pad_color);
    }
    
     /**
     * 简化版letterbox函数 - 创建正方形画布并将原图放在左上角
     * @param source 输入图像
     * @return 处理后的正方形图像
     */
    static cv::Mat letterbox(const cv::Mat& source) {
        int col = source.cols;
        int row = source.rows;
        int _max = std::max(col, row);
        
        // 创建正方形黑色画布
        cv::Mat result = cv::Mat::zeros(_max, _max, CV_8UC3);
        
        // 将原图复制到左上角
        source.copyTo(result(cv::Rect(0, 0, col, row)));
        return result;
    }
};

} // namespace AVSAnalyzer

#endif